package pro.cherish.knowledgedemoasync.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import pro.cherish.knowledgedemoasync.t1.Child;
import pro.cherish.knowledgedemoasync.t1.Child3;

/**
 * @author 创建人：cherish
 * @version 版本号：V1.0
 * <p>
 * ***************************修订记录************************************
 * 2019-10-27 cherish 创建该类功能。
 * **********************************************************************
 * </p>
 * @ClassName 类名：TestController2
 * @Description 功能说明：
 * <p>
 * TODO
 * </p>
 * **********************************************************************
 * @date 创建日期： 2019-10-27 cherish
 */

/**
 * 异步需要直接走异步方法，或者走同步方法，同步方法调用“其他类”的异步方法，这样才能异步生效
 * 如果是走同步方法作为过渡，调用该同步方法所在类的异步方法，则异步效果失效。
 */
@RestController
@Slf4j
public class TestController2 {

    @Autowired
    private Child child;
    @Autowired
    private Child3 child3;

    /**
     * 测试直接走异步方法
     * 输出结果;
     * 2019-10-27 17:35:25.374  INFO 9632 --- [nio-8080-exec-5] p.c.a.controller.TestController2         : 主程序结束
     * 2019-10-27 17:35:25.374  INFO 9632 --- [         task-3] pro.cherish.knowledgedemoasync.t1.Child           : begin   异步执行任务
     * 2019-10-27 17:35:27.375  INFO 9632 --- [         task-3] pro.cherish.knowledgedemoasync.t1.Child           : end   异步执行任务
     * 结论：成功
     *
     * @throws InterruptedException
     */

    @RequestMapping("/test01")
    public void test01() throws InterruptedException {
        child.takePhone_async();
        log.info("主程序结束");
    }

    /**
     * 测试走同类的异步方法
     * 输出结果：
     * 2019-10-27 17:36:11.653  INFO 9632 --- [nio-8080-exec-2] pro.cherish.knowledgedemoasync.t1.Child           : 起床开始
     * 2019-10-27 17:36:11.653  INFO 9632 --- [nio-8080-exec-2] pro.cherish.knowledgedemoasync.t1.Child           : begin   异步执行任务
     * 2019-10-27 17:36:13.654  INFO 9632 --- [nio-8080-exec-2] pro.cherish.knowledgedemoasync.t1.Child           : end   异步执行任务
     * 2019-10-27 17:36:13.654  INFO 9632 --- [nio-8080-exec-2] pro.cherish.knowledgedemoasync.t1.Child           : 起床结束
     * 2019-10-27 17:36:13.654  INFO 9632 --- [nio-8080-exec-2] p.c.a.controller.TestController2         : 主程序结束
     * 结论：同类过渡失败，异步失效
     *
     * @throws InterruptedException
     */
    @RequestMapping("/test02")
    public void test02() throws InterruptedException {
        child.getUp();
        log.info("主程序结束");
    }


    /**
     * 测试走其他类的异步方法
     * 2019-10-27 17:37:26.243  INFO 9632 --- [nio-8080-exec-4] pro.cherish.knowledgedemoasync.t1.Child3          : 起床开始
     * 2019-10-27 17:37:26.243  INFO 9632 --- [nio-8080-exec-4] pro.cherish.knowledgedemoasync.t1.Child3          : 起床结束
     * 2019-10-27 17:37:26.243  INFO 9632 --- [nio-8080-exec-4] p.c.a.controller.TestController2         : 主程序结束
     * 2019-10-27 17:37:26.243  INFO 9632 --- [         task-5] pro.cherish.knowledgedemoasync.t1.Phone           : begin   拨打电话
     * 2019-10-27 17:37:28.243  INFO 9632 --- [         task-5] pro.cherish.knowledgedemoasync.t1.Phone           : end   拨打电话
     * 结论：异步生效
     *
     * @throws InterruptedException
     */
    @RequestMapping("/test03")
    public void test03() throws InterruptedException {
        child3.getUp();
        log.info("主程序结束");
    }


}
